package middleware

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

// CORSMiddleware 用于处理Web应用程序中的跨域请求的中间件
func CORSMiddleware() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		//允许所有域名的请求
		ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
		//预检请求的效果可以被缓存86400s
		ctx.Writer.Header().Set("Access-Control-Max-Age", "86400")
		//允许所有HTTP的请求方法
		ctx.Writer.Header().Set("Access-Control-Allow-Methods", "*")
		//允许所有请求头
		ctx.Writer.Header().Set("Access-Control-Allow-Headers", "*")
		//允许携带身份凭证进行跨域请求。
		ctx.Writer.Header().Set("Access-Control-Allow-Credentials", "true")

		//对于OPTIONS类型的跨域请求(预检请求)，则直接返回200
		//当使用 CORS机制时，浏览器会先发送一个预检请求，以确定是否可以安全地发送实际请求。c
		//预检请求使用 OPTIONS方法，它会向服务器询问当前请求所支持的 HTTP 方法、头部信息以及是否允许发送身份认证信息等。
		//在服务器收到 OPTIONS请求后，会根据客户端请求中的头部信息和请求方法来判断是否允许该跨域请求。
		//如果允许，则返回一个带有响应头部信息的200OK 响应；否则，返回一个403 Forbidden或404 Not Found等状态码的响应，告知无法进行跨域请求。
		if ctx.Request.Method == http.MethodOptions {
			ctx.AbortWithStatus(200)
		} else {
			ctx.Next()
		}
	}
}
